package com.example.kotlindemo.协程

import kotlinx.coroutines.CoroutineName
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.CoroutineStart
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.Job
import kotlinx.coroutines.async
import kotlinx.coroutines.cancelAndJoin
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.coroutines.newSingleThreadContext
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withContext
import kotlinx.coroutines.yield
import kotlin.coroutines.EmptyCoroutineContext

class CoroutineTest {
    // 代码段 1
    fun main() {
        val coroutineScope = CoroutineScope(EmptyCoroutineContext)
        coroutineScope.launch {
            // 协程体 block 调用
            testSuspend1()
        }
    }

    suspend fun testSuspend1(): String {
        // 另一个挂起函数调用
        testSuspend2()
        return ""
    }

    suspend fun testSuspend2() {
        println("")
    }

    fun normalMethod() {
        // 报错
        //testSuspend2()
    }
}

fun main() {

//    val coroutineScope = CoroutineScope(EmptyCoroutineContext)
//    coroutineScope.launch {
//        // 协程体 block 调用
//        println("test")
//    }
//
//    var context = Job() + Dispatchers.IO  + CoroutineName("安卓")
//    print("$context")
//    println("${context[CoroutineName]}")
//    context = context.minusKey(Job)
//    println("minusKey:$context")
//
//
//    suspend fun fetchUserInfo() {     // Dispatchers.Main
//        withContext(Dispatchers.IO) { // Dispatchers.IO
//            // 执行网络请求             // Dispatchers.IO
//        }                             // Dispatchers.Main
//    }
//
//
//
//    coroutineScope.launch {
//        val test = async {
//        }
//    }
//
//
//    val  job = GlobalScope.launch(start = CoroutineStart.LAZY) {
////        runBlocking {
////
////        }
//        delay(1000)
//        val result = async {
//            delay(200)
//            1
//        }
//
//        result.invokeOnCompletion {
//            if(it!=null){
//
//            }else{
//
//            }
//
//        }
//
//        result.cancelAndJoin()
//
//        val result2 = async(start = CoroutineStart.LAZY) {
//            delay(200)
//            2
//        }
//        val total  = result.await()+result2.await();
//        print(total)
//    }
//
//
//
//    runBlocking {
//        GlobalScope.launch {
//
//        }
//
//        launch {
//            delay(1000)
//        }
//
//        val job = launch {
//            print(1)
//            yield() //移交出去
//            println(2)
//            yield()
//        }
//
//        val job2 = launch {
//            print(1)
//            yield() //移交出去
//            println(2)
//            yield()
//        }
//
//        print(0)
//        job.join()
//        job2.join()
//
//
//    }
//
//
//
//
//    coroutineScope{
//
//    }
//


    val job = GlobalScope.launch {
        withContext(Dispatchers.Default){

        }

        val job = launch(coroutineContext) {

        }

        throw  RuntimeException("ERROR")

//        val result = coroutineScope() {
//            delay(1000)
//            2
//        }



    }

    runBlocking(Dispatchers.Default) {
        val job = ArrayList<Job>()
        job += launch(Dispatchers.Unconfined) {  }
        job += launch(coroutineContext) {  }
        job += launch(Dispatchers.IO) {  }
        job += launch(newSingleThreadContext("luge")){}
    }

    //业务 A B C



}

suspend fun test(){

    withContext(Dispatchers.IO){
        delay(1000)
        1
        ""
        true
    }
}